import json
import re
from datetime import datetime

import bs4


def generate_kb_info_from_html(file_path: str) -> dict:
    """
    生成课表数据
    :param file_path: html文件地址
    """
    with open(file_path, 'r', encoding='utf-8') as f:
        soup = bs4.BeautifulSoup(f, 'lxml')
    # 节次到时间的映射，均提前10分钟
    with open(r"data\settings.json", 'r', encoding='utf-8') as f:
        jc2time = json.load(f)['jc2time']
    tags = soup.find_all(id=re.compile(r"^jc_\d-\d-\d"))
    kb_info = {}
    for tag in tags:
        # jc_1-1-3  jc: 节次  1: 星期一  1-3: 1-3节
        # print(tag['id'])
        t: str = tag['id'].split("_")[-1]
        xq, st, ed = t.split("-")
        info = tag.next_sibling.text.split()
        name, cycle = info[:2]
        wk = re.findall(r"\d+-\d+|\d+", cycle)
        # 把 1-4 这种换成 1 2 3 4
        weeks = []
        for w in wk:
            if "-" in w:
                s, e = list(map(int, w.split("-")))
                weeks += [str(i) for i in range(s, e + 1)]
            else:
                weeks.append(int(w))
        # 只用考虑开始的时间就行了，不用记录ed
        start = jc2time[st]
        for week in weeks:
            kb_info[week] = kb_info.get(week, {})
            kb_info[week][xq] = kb_info[week].get(xq, [])
            kb_info[week][xq].append([start, name])
    return kb_info


def get_success_msg(course_name: str, desc: str = "成功") -> tuple[str, str]:
    date_now = datetime.now()
    # 格式化日期时间为 "年月日 时时分" 的形式，例如 "2024年5月17日 08时20分"
    formatted_datetime = date_now.strftime("%Y年%m月%d日 %H时%M分")
    subject = f"[签到通知] 成功 - {formatted_datetime} 签到详情"
    content = (f'尊敬的使用者:\n本邮件旨在通知您，今日的签到流程已顺利完成。\n签到详情如下:\n签到日期: '
               f'{formatted_datetime.split(" ")[0]}\n签到时间: {formatted_datetime.split(" ")[1]}\n'
               f'签到课程: {course_name}\n签到状态: {desc}\n附件中包含了本次签到的截图，供您查阅。\n'
               f'若您不希望继续接收此类通知，请通过回复此邮件告知，您的邮箱地址将从通知列表中移除。\n感谢您的理解与合作。\n祝好\n')
    return subject, content


def get_fail_msg(course_name: str, desc: str = "失败") -> tuple[str, str]:
    date_now = datetime.now()
    # 格式化日期时间为 "年月日 时时分" 的形式，例如 "2024年5月17日 08时20分"
    formatted_datetime = date_now.strftime("%Y年%m月%d日 %H时%M分")
    subject = f"[签到通知] 失败 - {formatted_datetime} 签到未成功"
    content = (f'尊敬的使用者:\n通知您，今日的签到尝试未能成功完成。\n签到详情如下:\n签到日期: '
               f'{formatted_datetime.split(" ")[0]}\n签到时间: {formatted_datetime.split(" ")[1]}\n'
               f'签到课程: {course_name}\n签到状态: {desc}\n错误排查正在进行中。如果您有任何相关信息或疑问，'
               f'请通过回复此邮件与我们联系。\n若您不希望继续接收此类通知，请直接回复此邮件告知。\n感谢您的耐心和理解。\n祝好\n')
    return subject, content


def get_developer_msg(desc: str) -> tuple[str, str]:
    date_now = datetime.now()
    # 格式化日期时间为 "年月日 时时分" 的形式，例如 "2024年5月17日 08时20分"
    formatted_datetime = date_now.strftime("%Y年%m月%d日 %H时%M分")
    subject = "[紧急] 签到脚本出现错误 - 需要你的注意"
    content = (f"尊敬的开发者:\n通知您，签到脚本在 {formatted_datetime} 执行过程中遇到了一个错误。\n错误如下:\n{desc}\n"
               f"解决此问题需要您的协助。\n若您不希望继续接收此类紧急通知，请直接回复此邮件，您的邮箱地址将从通知列表中移除。\n"
               f"感谢您的理解与支持。\n祝好\n")
    return subject, content
